From b1952c4ac3ba4c498f1ba6da6dfbcdbb8a4081a5 Mon Sep 17 00:00:00 2001 From: George Dunlap Date: Tue, 26 Jul 2011 18:37:32 +0100 Subject: [PATCH] xen: AMD IOMMU: Automatically enable per-device vector maps Automatically enable per-device vector maps when using IOMMU, unless disabled specifically by an IOMMU parameter. Signed-off-by: George Dunlap --- xen/arch/x86/irq.c | 1 + xen/drivers/passthrough/amd/pci_amd_iommu.c | 15 +++++++++++++++ xen/drivers/passthrough/iommu.c | 3 +++ 3 files changed, 19 insertions(+) diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c index dbd5978622..dfec057b42 100644 --- a/xen/arch/x86/irq.c +++ b/xen/arch/x86/irq.c @@ -32,6 +32,7 @@ unsigned int __read_mostly nr_irqs_gsi = 16; unsigned int __read_mostly nr_irqs; integer_param("nr_irqs", nr_irqs); +/* This default may be changed by the AMD IOMMU code */ bool_t __read_mostly opt_irq_perdev_vector_map = 0; boolean_param("irq-perdev-vector-map", opt_irq_perdev_vector_map); diff --git a/xen/drivers/passthrough/amd/pci_amd_iommu.c b/xen/drivers/passthrough/amd/pci_amd_iommu.c index d8cc5b40e4..797588463e 100644 --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c @@ -25,6 +25,9 @@ #include #include +extern bool_t __read_mostly opt_irq_perdev_vector_map; +extern bool_t __read_mostly iommu_amd_perdev_vector_map; + struct amd_iommu *find_iommu_for_device(int bdf) { BUG_ON ( bdf >= ivrs_bdf_entries ); @@ -148,6 +151,18 @@ int __init amd_iov_detect(void) return -ENODEV; } + /* Enable use of per-device vector map unless otherwise + * specified */ + if ( iommu_amd_perdev_vector_map ) + { + printk("AMD-Vi: Enabling per-device vector maps\n"); + opt_irq_perdev_vector_map=1; + } + else + { + printk("AMD-Vi: WARNING - not enabling per-device vector maps\n"); + } + return scan_pci_devices(); } diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c index a4bbe8ce88..7b6c2abd5f 100644 --- a/xen/drivers/passthrough/iommu.c +++ b/xen/drivers/passthrough/iommu.c @@ -49,6 +49,7 @@ bool_t __read_mostly iommu_qinval = 1; bool_t __read_mostly iommu_intremap = 1; bool_t __read_mostly iommu_hap_pt_share; bool_t __read_mostly iommu_debug; +bool_t __read_mostly iommu_amd_perdev_vector_map = 1; static void __init parse_iommu_param(char *s) { @@ -81,6 +82,8 @@ static void __init parse_iommu_param(char *s) iommu_dom0_strict = 1; else if ( !strcmp(s, "sharept") ) iommu_hap_pt_share = 1; + else if ( !strcmp(s, "no-perdev-vector-map") ) + iommu_amd_perdev_vector_map = 0; s = ss + 1; } while ( ss ); -- 2.30.2